#include "Player.h"
#include "Constant.h"
#include "Position.h"
#include "Labyrinth.h"
#include "Bomb.h"

#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int Player::numberOfPlayers = 0;

// On instancie un player

Player::Player(Labyrinth& _labyrinth, char actor)
: labyrinth(_labyrinth), representation(actor), cell(GROUND), range(1), numberOfBombs(1)
{
	birthPosition = labyrinth.getBirthPosition (actor); 
	currentPosition = birthPosition ;
	numberOfPlayers++;
}

Player::~Player()
{
	numberOfPlayers--;
}



bool Player::canMove (Direction direction)
{
	if(
		labyrinth.getElement(currentPosition, direction) == (WALL) ||
		labyrinth.getElement(currentPosition, direction) == (BLOCK) ||
		labyrinth.getElement(currentPosition, direction) == (BOMB) ||
		labyrinth.getElement(currentPosition, direction) == (WALLUP) ||
		labyrinth.getElement(currentPosition, direction) == (WALLBOT) ||
		labyrinth.getElement(currentPosition, direction) == (WALLRIGHT) ||
		labyrinth.getElement(currentPosition, direction) == (WALLLEFT)
	  )
		return false;
	return true;
}



void Player::move (Direction direction)
{
	if(!canMove(direction))		//On vérifie si on peut se déplacer, on ne fait rien si on ne peut pas
	{
		return;
	}
	else
	{
		cell = labyrinth.getElement(currentPosition);
		if (cell == BOMB)
		{
			//Si on vient de placer une bombe, elle est affichée, on la laisse
		}
		else
		{
			labyrinth.setElement(currentPosition, GROUND);		//Dans le cas contraire, on place du sol là où on était
		}
		
		
		
		currentPosition.move(direction);					//On se déplace sur la nouvelle position
		
		
		
		cell = labyrinth.getElement(currentPosition);		//On récupère le contenu de la case d'arrivée pour récupérer le bonus éventuellement présent...
		if (cell == BOMBUP)
		{
			cell = GROUND;
			increaseBombNumber();
		}
		if (cell == BOMBDOWN)
		{
			cell = GROUND;
			if (getNumberOfBombs() > 1)			//On applique les effets que si le joueur a assez de bombes pour éviter qu'il n'ait plus rien.
			{
				decreaseBombNumber();
			}
		}
		if (cell == FIREUP)
		{
			cell = GROUND;
			increaseRange();
		}
		if (cell == FIREDOWN)
		{
			cell = GROUND;
			if (getRange() > 1)		//On applique les effets que si le joueur possède assez de puissance, pour éviter qu'il se retrouve avec des bombes qui n'explosent pas.
			{
				decreaseRange();
			}
		}
		
		if (cell == FIRE)					//...ou appeler la mort du personnage s'il y a une trainée de feu
		{
			die();
			return;
		}
		
		labyrinth.setElement(currentPosition, representation);		//On place finalement le bomberman sur la case
	}
}




void Player::placeBomb (vector<Bomb>& bombs, float& elapsedTime)
{
	Bomb mybomb(getCurrentPosition(), range, elapsedTime, labyrinth);
	mybomb.getBomb(labyrinth);
	bombs.push_back(mybomb);
}




void Player::die()
{
	Position deathPosition (0, 0);
	setCurrentPosition(deathPosition);
}

















